//
//  UIImageView+BSKGetMainColor.m
//  MicroMemory
//
//  Created by rimi on 16/7/10.
//  Copyright © 2016年 BlueSky. All rights reserved.
//

#import "UIImage+BSKGetMainColor.h"

@implementation UIImage (BSKGetMainColor)
-(UIColor*)MainColorOfImage{
	
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
	int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
#else
	int bitmapInfo = kCGImageAlphaPremultipliedLast;
#endif
	
	//第一步 先把图片缩小 加快计算速度. 但越小结果误差可能越大
	CGSize thumbSize=CGSizeMake(50, 50);
	
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
	CGContextRef context = CGBitmapContextCreate(NULL,
												 thumbSize.width,
												 thumbSize.height,
												 8,//bits per component
												 thumbSize.width*4,
												 colorSpace,
												 bitmapInfo);
	
	CGRect drawRect = CGRectMake(0, 0, thumbSize.width, thumbSize.height);
	CGContextDrawImage(context, drawRect, self.CGImage);
	CGColorSpaceRelease(colorSpace);
	
	
	
	//第二步 取每个点的像素值
	unsigned char* data = CGBitmapContextGetData (context);
	
	if (data == NULL) return nil;
	
	NSCountedSet *cls=[NSCountedSet setWithCapacity:thumbSize.width*thumbSize.height];
	
	for (int x=0; x<thumbSize.width; x++) {
		for (int y=0; y<thumbSize.height; y++) {
			
			int offset = 4*(x*y);
			
			int red = data[offset];
			int green = data[offset+1];
			int blue = data[offset+2];
			int alpha =  data[offset+3];
			
			NSArray *clr=@[@(red),@(green),@(blue),@(alpha)];
			[cls addObject:clr];
			
		}
	}
	CGContextRelease(context);
	
	//第三步 找到出现次数最多的那个颜色
	NSEnumerator *enumerator = [cls objectEnumerator];
	NSArray *curColor = nil;
	
//	NSArray *MaxColor=nil;
//	NSUInteger MaxCount=0;
	
	CGFloat R = 0.0;
	CGFloat G = 0.0;
	CGFloat B = 0.0;
	CGFloat A = 0.0;
	NSInteger C = 0;
	while ( (curColor = [enumerator nextObject]) != nil )
	{
//		NSUInteger tmpCount = [cls countForObject:curColor];
		
		R+= [curColor[0] floatValue];
		G+= [curColor[1] floatValue];
		B+= [curColor[2] floatValue];
		A+= [curColor[3] floatValue];
		C++;
		
//		if ( tmpCount < MaxCount ) continue;
//		
//		MaxCount=tmpCount;
//		MaxColor=curColor;
		
	}
	R = R/C/255.0f;
	G = G/C/255.0f;
	B = B/C/255.0f;
	
	R -=0.2;
	G -=0.2;
	B -=0.2;
	if (R<0) {
		R=0;
	}
	if (G<0) {
		G=0;
	}
	if (B<0) {
		B=0;
	}
	
	return [UIColor colorWithRed:R green:G blue:B alpha:A/C/255.0f];
//	return [UIColor colorWithRed:([MaxColor[0] intValue]/255.0f) green:([MaxColor[1] intValue]/255.0f) blue:([MaxColor[2] intValue]/255.0f) alpha:([MaxColor[3] intValue]/255.0f)];
}
@end